package igrupobbva.pe.sistemareniec.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.grupobbva.iici.serializable.Corporativa;
import com.grupobbva.pe.SIR.service.message.ConsultaPorDNIResponse;
import com.ibm.www.operations.SubTramaRespuestaDatos2;
//import com.grupobbva.iici.util.ConstantesUtil;

/**
 * Clase de Ayuda para todos lo modulos. Fecha de creaci�n: (20/02/2008 09:40:22
 * a.m.)
 * 
 * @author Orlando Pihue M.
 */
public class FuncionesUtil {

	/**
	 * Metodo que permite Completar espacios en blanco y ceros.
	 * 
	 * @param longMax
	 *            Longitud Maxima de la cadena.
	 * @param cadena
	 *            cadena que requieres de espacios en blanco.
	 * @return space String quee contiene ceros y espacios en blanco.
	 */
	private static Logger logger = Logger.getLogger(FuncionesUtil.class);

	public static String completarSpace(String cadena, int longMax) {
		/** Space in White **/
		String space = "";

		for (int i = 0; i < longMax; i++) {
			space = " " + space;
		}
		space = cadena + space.substring(0, longMax - cadena.length());

		return space;

	}

	/**
	 * Metodo que permite Completar espacios en blanco y ceros
	 * 
	 * @param tipoDato
	 *            HashMap que contiene el tipo de dato osea (N:Numerico,
	 *            A:Alfanumerico).
	 * @param camposValorReceiveHash
	 *            HashMap que contiene datos de la trama.
	 * @return newSpaceOrZeros String quee contiene ceros y espacios en blanco.
	 */

	public static String completarSpacesOrZeros(LinkedHashMap tipoDato,
			LinkedHashMap camposValorReceiveHash) {
		/** Spaces in White and Zeros **/
		String spaceOrZeros = "";
		String newSpaceOrZeros = "";
		int tamanho = 0;
		Iterator it = tipoDato.entrySet().iterator();
		int contador = 0;
		while (it.hasNext()) {
			Map.Entry e = (Map.Entry) it.next();
			tamanho = Integer.parseInt(String.valueOf(camposValorReceiveHash
					.get(e.getKey())));
			contador = contador + tamanho;
			int errorReniec = 2;
			if (contador > errorReniec) {
				if (e.getValue().equals("A")) {
					camposValorReceiveHash.get(e.getKey());
					for (int i = 0; i < tamanho; i++) {
						spaceOrZeros = " " + spaceOrZeros;
					}
				} else {
					for (int i = 0; i < tamanho; i++) {
						spaceOrZeros = "0" + spaceOrZeros;
					}
				}
			}
		}
		for (int x = spaceOrZeros.length() - 1; x >= 0; x--)
			newSpaceOrZeros = newSpaceOrZeros + spaceOrZeros.charAt(x);
		return newSpaceOrZeros;

	}

	public static String printDateOperation(String format) {

		SimpleDateFormat sdf = new SimpleDateFormat(format);
		Calendar cal = Calendar.getInstance();
		Date fecha = null;
		String fechaformato = "";

		fecha = cal.getTime();
		fechaformato = sdf.format(fecha);
		return fechaformato;
	}

	public static String getFecha() {
		Calendar cal = Calendar.getInstance();
		Date fecha = cal.getTime();
		SimpleDateFormat fec = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		return fec.toString();
	}

	public static final void copiarArchivo(String origen, String destino)
			throws IOException {

		File o = new File(origen);

		File d = new File(destino);
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(o));
		BufferedOutputStream out = new BufferedOutputStream(
				new FileOutputStream(d));
		int bytesRead = 0;
		byte[] buffer = new byte[8192];
		while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
			out.write(buffer, 0, bytesRead);
		}
		in.close();
		out.flush();
		out.close();

	}

	public static SubTramaRespuestaDatos2 transformarRespuestaReniec(
			ConsultaPorDNIResponse rpta,List lista) {
		SubTramaRespuestaDatos2 subTramaRespuesta = new SubTramaRespuestaDatos2();
		//Sexo
		subTramaRespuesta.setSexo(ConstantesUtil.sexo(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosPersona().getSexo()));
		//Fecha de Expedicion
		subTramaRespuesta.setFechaExpedicion(ConstantesUtil.intToString(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosDNI().getFechaExpedicion()));
		//Fecha de Inscripcion
		subTramaRespuesta.setFechaInscripcion(ConstantesUtil.intToString(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosDNI().getFechaInscripcion()));
		//Fecha de Nacimiento
		subTramaRespuesta.setFechaNac(ConstantesUtil.intToString(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosNacimiento().getFecha()));
		//Estatura
		subTramaRespuesta.setEstatura(ConstantesUtil.estatura(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosPersona().getEstatura()));
		//Estado Civil
		subTramaRespuesta.setEstadoCivil(ConstantesUtil.estadoCivil(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosPersona().getCodigoEstadoCivil()));
		//Grado de Instruccion
		subTramaRespuesta.setGradoInstruccion(ConstantesUtil.gradoInst(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosPersona().getCodGradoInstruccion()));
		//Estado
		subTramaRespuesta.setRestricciones(getEstado(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosDNI().getCodigoRestriccion(), true,lista));
		//Const Votacion
		subTramaRespuesta.setConstVotacion(ConstantesUtil.votacion(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosDNI().getConstanciaVotacion()));
		//Numero de DNI
		subTramaRespuesta.setNumDNI(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDNI().getNumDNIConsultado());
		//Apellido Paterno
		subTramaRespuesta.setApellidoPat(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosPersona().getApellidoPaterno());
		
		//[16.04.2014] Se concatena el apeCasada en el campo ApeMat
		String apeCasada="";		
		if(rpta.getRefConsultaPorDNIResponse().getRespuestaDatos().getDatosPersona().getApellidoCasada()!=null){
			apeCasada= rpta.getRefConsultaPorDNIResponse().getRespuestaDatos().getDatosPersona().getApellidoCasada();
		}
		//Apellido Materno
		subTramaRespuesta.setApellidoMat(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosPersona().getApellidoMaterno() + " " +apeCasada );		
		//subTramaRespuesta.setApellidoMat(rpta.getRefConsultaPorDNIResponse().getRespuestaDatos().getDatosPersona().getApellidoMaterno());
		//Nombres
		subTramaRespuesta.setNombres(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosPersona().getNombres());
		//Departamento de Nacimiento
		subTramaRespuesta.setDptoNac(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosNacimiento().getDepartamento());
		//Nombre del Padre
		subTramaRespuesta.setNombrePadre(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosPersona().getNombrePadre());
		//Nombre de la Madre
		subTramaRespuesta.setNombreMadre(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosPersona().getNombreMadre());
		
		// subTramaRespuesta.setAnioEstudio(ConstantesUtil.anioEstudios(
		// subTramaRespuesta.getAnioEstudio()));//FIXME [MGLHPM] Este dato no se
		// esta obteniendo en la nueva consulta.

		// FIXME Por confirmar N. Libro
		// FIXME A�o de estudio
		subTramaRespuesta.setDocSust(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosPersona()
				.getNumeroDocSustentario());
		//Provincia de nacimiento
		subTramaRespuesta.setProvNac(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosNacimiento().getProvincia());
		//Distrito de nacimiento
		subTramaRespuesta.setDistNac(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosNacimiento().getDistrito());
		// subTramaRespuesta.setLocalNac("");//FIXME falta este dato

		subTramaRespuesta.setDepartamentoDom(rpta
				.getRefConsultaPorDNIResponse().getRespuestaDatos()
				.getDatosDomicilio().getDepartamento());
		subTramaRespuesta.setProvinciaDom(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosDomicilio().getProvincia());
		subTramaRespuesta.setDistritoDom(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosDomicilio().getDistrito());
		// subTramaRespuesta.setLocalidadDom(""); //FIXME falta este dato
		subTramaRespuesta.setDireccion(rpta.getRefConsultaPorDNIResponse()
				.getRespuestaDatos().getDatosDomicilio().getDireccion());

		return subTramaRespuesta;
	}

	private static String getEstado(String estado, boolean flag,List lista) {
		System.out.println("Muestrame valor de estado filtro : " + estado);
		String est = "";
		try {
			if (lista != null && lista.size() > 0) {
				for (int i = 0; i < lista.size(); i++) {
					Corporativa corporativa = new Corporativa();
					corporativa = (Corporativa) lista.get(i);

					if (corporativa.getValor1() == null) {
						est = corporativa.getValor2();
					} else if (corporativa.getValor1().equals(estado)) {
						est = corporativa.getValor2();
					}

					System.out.println("tmaño de lista :" + lista.size());
					System.out.println("muestrame el valor de estado : "
							+ corporativa.getValor1());
					System.out.println("muestrame el valor de descripcion : "
							+ corporativa.getValor2());
				}

			} else {
				est = "";
			}

			if (!flag)
				if (est.length() > 11)
					est = est.substring(0, 12);

		} catch (Exception e) {
			est = "";
		}
		/** Truncar 12 tama�o */

		return est;
	}
	
	public static String convertDateAsStringToString(String dateAsString, String formatInput, String formatOutput)
	{
		if(StringUtils.isEmpty(dateAsString))
		{
			return StringUtils.EMPTY;
		}
		DateFormat dateFormatInput = new SimpleDateFormat(formatInput);
		
		Date fecha;
		try {
			fecha = dateFormatInput.parse(dateAsString);
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
		
		DateFormat dateFormatOutput = new SimpleDateFormat(formatOutput);
		
		return dateFormatOutput.format(fecha);
	}
	
	public static String convertDateReniecToString(String dateAsString)
	{
		return convertDateAsStringToString(dateAsString, "yyyyMMdd", "dd-MM-yyyy");
	}

}